package com.group9.handinhand.service;

import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.group9.handinhand.service.so.CommunitySO;
import com.group9.handinhand.service.so.CommunityTagSO;
import com.group9.handinhand.service.so.EventSO;
import com.group9.handinhand.service.so.EventTagSO;
import com.group9.handinhand.service.so.OfferSO;
import com.group9.handinhand.service.so.OfferTagSO;
import com.group9.handinhand.service.so.RequestSO;
import com.group9.handinhand.service.so.RequestTagSO;
import com.group9.handinhand.service.so.TagSO;
import com.group9.handinhand.service.so.UserSO;
import com.group9.handinhand.service.so.UserTagSO;
/**
 * 
 * Interface that defines the tag service.
 *
 */
public interface TagService {
	
	static final Logger logger = LoggerFactory.getLogger(TagService.class);
		
	public TagSO getTagById(Long tagId);
	
	public TagSO getTagByName(String name);
	
	public List<TagSO> getAllTags();

	public void saveUserTags(UserSO userSO, List<String> selectedTags);

	public List<TagSO> getTagsByRelatedUserId(long userId);

	public void saveTag(TagSO tag);

	public UserTagSO getUserTagByTagAndUser(TagSO tagSO, UserSO userSO);

	public void saveUserTag(UserTagSO userTag);

	public List<UserTagSO> getUserTagsByUser(UserSO userSO);

	public void deleteUserTag(UserTagSO userTagSO);
	
	public void saveCommunityTags(CommunitySO communitySO, List<String> selectedTags);

	public List<TagSO> getTagsByRelatedCommunityId(long communityId);

	public CommunityTagSO getCommunityTagByTagAndCommunity(TagSO tagSO, CommunitySO communitySO);

	public void saveCommunityTag(CommunityTagSO communityTag);

	public List<CommunityTagSO> getCommunityTagsByCommunity(CommunitySO communitySO);

	public void deleteCommunityTag(CommunityTagSO communityTagSO);

	public void saveEventTags(EventSO event, List<String> selectedTags);
	
	public List<TagSO> getTagsByRelatedEventId(long eventId);

	public EventTagSO getEventTagByTagAndEvent(TagSO tagSO, EventSO eventSO);

	public void saveEventTag(EventTagSO eventTag);

	public List<EventTagSO> getEventTagsByEvent(EventSO eventSO);

	public void deleteEventTag(EventTagSO eventTagSO);
	
	public void saveOfferTags(OfferSO offer, List<String> selectedTags);
	
	public List<TagSO> getTagsByRelatedOfferId(long offerId);

	public OfferTagSO getOfferTagByTagAndOffer(TagSO tagSO, OfferSO offerSO);

	public void saveOfferTag(OfferTagSO offerTag);

	public List<OfferTagSO> getOfferTagsByOffer(OfferSO offerSO);

	public void deleteOfferTag(OfferTagSO offerTagSO);

	public void saveRequestTags(RequestSO request, List<String> selectedTags);

	public void deleteRequestTag(RequestTagSO requestTagSO);

	void saveRequestTag(RequestTagSO requestTag);

	public List<RequestTagSO> getRequestTagsByRequest(RequestSO requestSO);

	public RequestTagSO getRequestTagByTagAndRequest(TagSO tagSO, RequestSO requestSO);

	public List<TagSO> getTagsByRelatedRequestId(long requestId);


}